const { BrowserWindow } = require("electron/main");
const path = require("node:path");

const commonWindowOptions = {
    // ico 文件是多种尺寸图片的集合, 建议使用 ico 文件作为应用的图标, window系统会结合当前显示设备的分辨率挑选一张最合适的图片作图标
    icon: path.join(__dirname, "../static/favicon.ico"),
    devTools: true,
    // 是否集成node.js
    nodeIntegration: true,
    sandbox: false,
    // 同源策略
    webSecurity: false,
    // 允许一个 https 页面运行来自http url的JavaScript, CSS 或 plugins
    allowRunningInsecureContent: true,
    // 是否在独立 JavaScript 环境中运行 Electron API和指定的preload 脚本(是否在渲染进程中开启node.js支持)
    contextIsolation: true,
    // 是否开启 webview 标签
    webviewTag: true,
    // 窗口透明化
    transparent: true
}

const getWindowStatus = (win, flag) => {
    const status = {
        'useMini': win.minimizable, // 窗口是否可被用户手动最小化
        'userMaxi': win.maximizable, // 窗口是否可被用户手动最大化
        'resize': win.resizable, // 窗口是否可被用户手动调整大小
        'closable': win.closable, // 窗口是否可被用户手动关闭
        'movable': win.movable, // 窗口是否可被用户移动
        'focus': win.isFocused(), // 判断窗口是否聚焦
        'destroyed': win.isDestroyed(), // 判断窗口是否被销毁
        'isMini': win.isMinimized(), // 判断窗口是否最小化
        'isFull': win.isFullScreen(), // 窗口当前是否已全屏
        'bounds': win.getBounds(), // 获取窗口信息
        'isTop': win.isAlwaysOnTop(), // 窗口是否置顶
        'windowId': win.getMediaSourceId(), // 获取窗口ID
        'windowHwnd': win.getNativeWindowHandle(), // 获取窗口句柄
        'size': win.getSize(), // 获取窗口的宽度和高度
    }
    return status[flag]
}

const settingWindowAttribute = (win, flag, info) => {
    const status = {
        'destroy': win.destroy(), // 强制关闭窗口, 除了closed之外，close，unload 和 beforeunload 都不会被触发
        'close': win.close(), // 尝试关闭窗口
        'focus': win.focus(), // 聚焦于窗口
        'blur': win.blur(), // 取消窗口的聚焦
        'show': win.show(), // 显示并聚焦于窗口
        'showInactive': win.showInactive(), // 显示但不聚焦于窗口
        'hide': win.hide(), // 隐藏窗口
        'maxi': win.maximize(), // 最大化窗口
        'unmaxi': win.unmaximize(), // 取消窗口最大化
        'mini': win.minimize(), // 最小化窗口
        'restore': win.restore(), // 将窗口从最小化状态恢复到以前的状态。
        'fullScreen': win.setSimpleFullScreen(true), // 进入或离开简单的全屏模式
        'opacity': win.setOpacity(0.2), // 设置窗口的不透明度
        'background': win.setBackgroundColor('rgb(255, 145, 145)')
    }
    if(info) {
        status.setBound = win.setBounds({ x: info.x, y: info.y, width: info.width, height: info.height }) // 设置窗口的尺寸和位置
    }
    return status[flag]
}

const createMainWindow = () => {
    let mainWindow = new BrowserWindow({
        // title底层优先级：html标题 -> browserWindow.title -> package.json.name -> 默认 electron
        title: '主窗口标题',
        width: 800,
        height: 600,
        backgroundColor: '#2e2c29',
        webPreferences: {
            preload: path.join(__dirname, "../../", "preload", "index.js"),
        },
        // 优化首次窗口加载时闪烁问题, 先设置为 false
        show: false,
        ...commonWindowOptions
    });

    mainWindow.loadFile("src/renderer/index.html");
    mainWindow.webContents.openDevTools();
    mainWindow.webContents.on('render-process-gone', (event, detail) => {
        console.log('渲染进程崩溃或被杀死触发 => ', detail)
    })
    mainWindow.webContents.on('unresponsive', () => {
        console.log('网页变得未响应时触发')
    })
    mainWindow.webContents.on('responsive', () => {
        console.log('未响应的页面变成响应时触发')
    })
    
    // 窗口将要关闭时触发
    mainWindow.on('close', (event) => {
        // 阻止窗口关闭
        event.preventDefault()
    })
    // 窗口关闭时触发
    mainWindow.on('closed', (event) => {
        if (mainWindow) {
            mainWindow.removeAllListeners();
            mainWindow = null
        }
    })
    // 窗口失去焦点时触发
    mainWindow.on('blur', (event) => {})
    // 窗口获取焦点时触发
    mainWindow.on('focus', (event) => {})
    // 窗口显示时触发
    mainWindow.on('show', (event) => {})
    // 窗口隐藏时触发
    mainWindow.on('hide', (event) => {})
    // 页面已经渲染完成时触发
    mainWindow.on('ready-to-show', (event) => {})
    // 窗口最大化时触发
    mainWindow.on('maximize', (event) => {})
    // 窗口最小化时触发
    mainWindow.on('minimize', (event) => {})
    // 当窗口从最小化状态恢复时触发
    mainWindow.on('restore', (event) => {})
    // 调整窗口大小前触发
    mainWindow.on('will-resize', (event) => {
        event.preventDefault()
    })
    // 调整窗口大小后触发
    mainWindow.on('resize', (event) => {})
    // 窗口移动前触发
    mainWindow.on('will-move', (event) => {})
    // 窗口移动到新位置时触发
    mainWindow.on('move', (event) => {})
    // 窗口进入全屏状态时触发
    mainWindow.on('enter-full-screen', (event) => {})
    // 窗口离开全屏状态时触发
    mainWindow.on('leave-full-screen', (event) => {})
    // 设置或取消设置窗口总是在其他窗口的顶部显示时触发
    mainWindow.on('always-on-top-changed', (event) => {})

    return mainWindow
};

const createChildWindow = (parentWindow) => {
    let childWindow = new BrowserWindow({
        title: '子窗口标题',
        // 子窗口总是显示在父窗口顶部
        // 可将窗口组合起来, 当关闭父级窗口时子窗口也可会连同关闭, 这样一来不用一个个关闭(子窗口总是显示在父窗口顶部)
        parent: parentWindow,
        width: 814,
        height: 300,
        resizable: true,
        // 是否移除应用窗口的标题栏、菜单栏以及边框
        frame: false,
        movable: true,
        transparent: true,
        webPreferences: {
            preload: path.join(__dirname, "../../", "preload", "index.js"),
        },
        show: false,
        ...commonWindowOptions
    });

    childWindow.loadFile("src/renderer/index.html");
    childWindow.setAlwaysOnTop(true, 'screen-saver', 2)

    return childWindow
};

const handleWindow = () => {
    // 优化首次窗口渲染闪烁问题, 先隐藏窗口, 等待窗口准备就绪再显示
    const mainWindow = createMainWindow();
    mainWindow.once('ready-to-show', () => {
        mainWindow.show()
    })

    const childWindow = createChildWindow(mainWindow);
    childWindow.once('ready-to-show', () => {
        childWindow.show()
    })

    const allWindow = BrowserWindow.getAllWindows();
    const currentFocusWindow = BrowserWindow.getFocusedWindow();

    return {
        mainWindow,
        childWindow,
        allWindow: allWindow && allWindow.length > 0 ? allWindow : [],
        currentFocusWindow
    }
}

module.exports = {
    handleWindow
}